package jdk;

import custom.CCTVMeiPo;
import sun.misc.ProxyGenerator;

import java.io.FileDescriptor;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.lang.reflect.Proxy;

/**
 * @author cctv
 */
public class TestFindLove {

    public static void main(String[] args) {
//        new ZhangSan().findLove();
        try {

            Person obj = null;
            obj = (Person) new MeiPo().getInstance(new ZhangSan());
            System.out.println("代理之后的对象：" + obj.getClass());
            obj.findLove();

            // 原理：
            // 1.拿到被代理对象的引用，然后获取它的接口
            // 2.JDK代理重新生成一个类,同时实现我们给的代理对象所实现的接口
            // 3.把被带离对象的引用也拿到了
            // 4.重新动态生成一个class字节码
            // 5.然后编译

            // 获取字节码内容
            byte[] data = ProxyGenerator.generateProxyClass("$Proxy0", new Class[]{obj.getClass()});
            FileOutputStream os = new FileOutputStream("D:\\$Proxy0.class");
            os.write(data);
            os.close();

            System.out.println("===================使用自定义的代理===================");
            // 根据原理写一个自定义的代理
            Person customObj = (Person)new CCTVMeiPo().getInstance(new ZhangSan());
            System.out.println("代理之后的对象：" +customObj.getClass());
            customObj.findLove();

        } catch (Exception e) {
            e.printStackTrace();

        }
    }
}
